package com.company.genealogy.common.result;

import com.company.genealogy.common.constant.ApiCodeEnum;
import lombok.Data;

/**
 * 统一API响应结构
 * @author chenzhixiang
 */
@Data
public class ApiResponse<T> {
    /**
     * 业务状态码
     */
    private int code;
    /**
     * 提示信息
     */
    private String msg;
    /**
     * 响应数据
     */
    private T data;

    /**
     * 操作成功（无数据）
     * @param <T> 泛型
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> success() {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.setCode(ApiCodeEnum.SUCCESS.getCode());
        resp.setMsg(ApiCodeEnum.SUCCESS.getMsg());
        return resp;
    }

    /**
     * 操作成功（自定义状态码）
     * @param codeEnum 状态码枚举
     * @param <T> 泛型
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> success(ApiCodeEnum codeEnum) {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.setCode(codeEnum.getCode());
        resp.setMsg(codeEnum.getMsg());
        return resp;
    }

    /**
     * 操作成功（带数据）
     * @param data 响应数据
     * @param <T> 泛型
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> success(T data) {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.setCode(ApiCodeEnum.SUCCESS.getCode());
        resp.setMsg(ApiCodeEnum.SUCCESS.getMsg());
        resp.setData(data);
        return resp;
    }

    /**
     * 操作成功（自定义状态码+数据）
     * @param codeEnum 状态码枚举
     * @param data 响应数据
     * @param <T> 泛型
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> success(ApiCodeEnum codeEnum, T data) {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.setCode(codeEnum.getCode());
        resp.setMsg(codeEnum.getMsg());
        resp.setData(data);
        return resp;
    }

    /**
     * 操作失败（默认失败码）
     * @param <T> 泛型
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> fail() {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.setCode(ApiCodeEnum.FAIL.getCode());
        resp.setMsg(ApiCodeEnum.FAIL.getMsg());
        return resp;
    }

    /**
     * 操作失败（自定义失败信息）
     * @param msg 失败提示信息
     * @param <T> 泛型
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> fail(String msg) {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.setCode(ApiCodeEnum.FAIL.getCode());
        resp.setMsg(msg);
        return resp;
    }

    /**
     * 操作失败（自定义失败码）
     * @param codeEnum 状态码枚举
     * @param <T> 泛型
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> fail(ApiCodeEnum codeEnum) {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.setCode(codeEnum.getCode());
        resp.setMsg(codeEnum.getMsg());
        return resp;
    }

    /**
     * 操作失败（自定义失败码+自定义消息）
     * @param codeEnum 状态码枚举
     * @param msg 自定义消息
     * @param <T> 泛型
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> error(ApiCodeEnum codeEnum, String msg) {
        ApiResponse<T> resp = new ApiResponse<>();
        resp.setCode(codeEnum.getCode());
        resp.setMsg(msg);
        return resp;
    }
} 